# Wi-Fi Scan ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 功能概述 **Wi-Fi Scan(Wi‑Fi扫描)** 功能用于探测周围可用的Wi-Fi接入点(Access Point),并获取其详细信息(如服务集标识符SSID、基本服务集标识符BSSID、信号强度RSSI和信道等)。Wi-Fi Scan支持同步和异步两种工作模式,广泛应用于物联网设备、智能家居及网络管理等需要Wi-Fi网络环境检测的场景。 ## 基本要素 1. **扫描发起实体**:触发Wi-Fi扫描操作的主体,通常是移动终端、物联网设备或Wi-Fi探测设备。 2. **扫描目标(AP)**:Wi-Fi扫描的对象,即周围提供无线网络服务的接入点AP,如无线路由器、热点设备。 3. **扫描参数**:控制扫描行为的配置项,包括扫描的信道范围、时长、间隔等,决定了扫描的覆盖范围与执行效率。 4. **信号捕获单元**:Wi-Fi射频前端硬件,负责接收周围AP射频信号,是AP信号采集的物理载体。 5. **扫描结果集**:Wi-Fi扫描后生成的信息集合,通常包含AP的SSID、RSSI、加密方式、BSSID等核心数据。 6. **射频信道**:Wi-Fi扫描所使用的无线频段信道,是AP与扫描实体之间的通信载体。 ## 工作流程 Wi-Fi Scan是Wi‑Fi射频轮询探测、帧捕获、协议解析、数据规整的完整链路,依托信道快速切换与802.11帧解析实现AP信息采集,处理结果向上层业务交付的功能。具体工作流程如下: 1. **扫描初始化**:业务应用层下发扫描启动指令,Wi-Fi Scan功能完成射频单元、SPI/SDIO通信接口等硬件初始化及内部状态机初始化,完成后切换至扫描就绪状态,等待业务层配置扫描参数。 2. **扫描参数配置**:业务应用层下发扫描配置参数(信道范围、主动/被动模式、探测时长),Wi-Fi Scan功能依据配置生成信道切换时序与探测规则,预加载后续扫描执行逻辑。 3. **射频信道探测**:Wi-Fi Scan功能按预规划的信道序列切换射频链路,主动扫描向外发送探测请求帧、被动扫描监听Beacon广播,同步捕获AP的原始信号数据与RSSI。 4. **AP信息解析与整理**:Wi-Fi Scan功能对捕获的信号帧进行协议解析,提取SSID/BSSID等AP信息;对同BSSID重复数据做去重处理,并按照RSSI从高到低排序,生成结构化结果集。 5. **扫描结果反馈与缓存**:Wi-Fi Scan功能经由内部交互接口向业务应用层回传AP结果集,同时在本地缓存扫描数据以支持快速二次查询,最后释放本次扫描所用临时内存,归还占用的射频硬件资源。 ## 扫描模式分类 基于程序流程是否阻塞,扫描模式分为同步扫描和异步扫描,详情如下: 1. **同步扫描** - **对应函数**:*qosa_wifiscan_do()* - **基本概念**:调用扫描函数后,当前线程会被阻塞,直到扫描完成并返回结果后,才能继续执行后续逻辑。 - **适用场景**:对流程顺序要求严格、无需并行处理其他任务的简单单次扫描需求。 2. **异步扫描(默认)** - **对应函数**:*qosa_wifiscan_async()* - **基本概念**:调用扫描函数后,当前线程不阻塞,可继续执行其他任务;扫描完成后,结果通过预先注册的回调函数 *qosa_wifiscan_register_cb()* 返回。 - **适用场景**:需要并行处理多任务、避免界面卡顿的场景(如UI交互过程中触发扫描)。 ## 典型应用场景 - 物联网设备的Wi-Fi网络环境检测与最优网络选择。 - 智能家居设备的网络连接与配网。 - 网络管理工具的Wi-Fi环境分析。 - 需要定期监控Wi-Fi网络状态的应用场景。 # Wi-Fi Scan API ## 头文件 *qosa_wifiscan.h* ## 函数概览 | **函数** | **说明** | | --- | --- | | *qosa_wifiscan_open()* | 启用Wi-Fi Scan | | *qosa_wifiscan_close()* | 关闭Wi-Fi Scan | | *qosa_wifiscan_do()* | 开始Wi-Fi Scan同步模式扫描 | | *qosa_wifiscan_async()* | 开始Wi-Fi Scan异步模式扫描 | | *qosa_wifiscan_option_set()* | 配置Wi-Fi Scan扫描参数 | | *qosa_wifiscan_get_config()* | 获取Wi-Fi Scan配置参数 | | *qosa_wifiscan_register_cb()* | 注册异步扫描回调函数 | ## 函数详解 ### qosa_wifiscan_open - **功能描述** 启用Wi-Fi Scan。在使用其他Wi-Fi Scan功能前,必须先调用此函数启用Wi-Fi Scan。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_open(void) ``` - **参数说明** 无 - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 *QOSA_WIFISCAN_OPEN_FAIL*:Wi-Fi Scan启用异常 *QOSA_WIFISCAN_ALREADY_OPEN_ERR*:Wi-Fi Scan重复启用错误 *QOSA_WIFISCAN_HW_OCCUPIED_ERR*:硬件被占用 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ### qosa_wifiscan_close - **功能描述** 关闭Wi-Fi Scan。扫描完成后须调用此函数关闭Wi-Fi Scan功能,释放相关资源。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_close(void) ``` - **参数说明** 无 - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ### qosa_wifiscan_do - **功能描述** 开始Wi-Fi Scan同步模式扫描。调用此函数后,当前线程会被阻塞直至扫描完成,扫描结果直接返回。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_do( qosa_uint16_t *p_ap_cnt, qosa_wifi_ap_info_t *p_ap_infos ) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *p_ap_cnt* | 输出 | qosa_uint16_t | 扫描到的AP数量 | | *p_ap_infos* | 输出 | *qosa_wifi_ap_info_t* | 扫描获取的每个AP信息;详见 [*qosa_wifi_ap_info_t*](#qosawifiapinfot) | - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ### qosa_wifiscan_async - **功能描述** 开始Wi-Fi Scan异步模式扫描。调用此函数后,当前线程不会被阻塞,扫描结果通过注册的回调函数 ***qosa_wifiscan_register_cb()*** 返回。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_async(void) ``` - **参数说明** 无 - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ### qosa_wifiscan_option_set - **功能描述** 配置Wi-Fi Scan扫描参数。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_option_set( qosa_wifiscan_config_t *wifiscan_config ) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *wifiscan_config* | 输入 | *qosa_wifiscan_config_t* | Wi-Fi Scan扫描参数;详见 [*qosa_wifiscan_config_t*](#qosawifiscanconfig_t) | - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ### qosa_wifiscan_get_config - **功能描述** 获取Wi-Fi Scan配置参数。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_get_config( qosa_wifiscan_config_t *wifiscan_config ) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *wifiscan_config* | 输出 | *qosa_wifiscan_config_t* | Wi-Fi Scan扫描参数;详见 [*qosa_wifiscan_config_t*](#qosawifiscanconfig_t) | - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 *QOSA_WIFISCAN_MEM_ADDR_NULL_ERR*:内存分配失败 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ### qosa_wifiscan_register_cb - **功能描述** 注册异步扫描回调函数。当异步扫描完成时,系统会调用此回调函数返回扫描结果。 - **函数原型** ```c qosa_wifiscan_error_e qosa_wifiscan_register_cb( qosa_wifiscan_callback wifiscan_cb, void *user_data ) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *wifiscan_cb* | 输入 | *qosa_wifiscan_callback* | 回调函数指针;详见 [*qosa_wifiscan_callback*](#qosawifiscancallback) | | *user_data* | 输入 | void | 用户自定义数据指针 | #### qosa_wifiscan_callback - **函数原型** ```c typedef void (*qosa_wifiscan_callback)( void *user_data, qosa_wifiscan_error_e result, qosa_uint32_t ap_cnt, qosa_wifi_ap_info_t *ap_infos ) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *user_data* | 输入 | void | 异步回调用户数据 | | *result* | 输入 | *qosa_wifiscan_error_e* | 扫描结果码;详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) | | *ap_cnt* | 输入 | qosa_uint32_t | 扫描到的AP数量 | | *ap_infos* | 输入 | *qosa_wifi_ap_info_t* | 扫描获取的每个AP信息;详见 [*qosa_wifi_ap_info_t*](#qosawifiapinfot) | - **返回值说明** *QOSA_WIFISCAN_SUCCESS*:函数执行成功 *QOSA_WIFISCAN_INVALID_PARAM_ERR*:无效参数 QOSA_WIFISCAN_ALREADY_OPEN_ERR:Wi-Fi Scan重复启用错误 其他值详见 [*qosa_wifiscan_error_e*](#qosawifiscanerror_e) ## 结构体定义 ### qosa_wifi_ap_info_t 扫描获取的每个AP信息结构体定义如下: ```c typedef struct { qosa_uint8_t bssid[6]; qosa_uint8_t channel; qosa_int8_t rssival; qosa_uint8_t ssid_len; qosa_uint8_t ssid[33]; char reserve; } qosa_wifi_ap_info_t ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *bssid* | qosa_uint8_t | Wi-Fi AP的MAC地址 | | *channel* | qosa_uint8_t | AP工作的信道 | | *rssival* | qosa_int8_t | AP的信号强度;单位:dBm | | *ssid_len* | qosa_uint8_t | SSID长度 | | *ssid* | qosa_uint8_t | Wi-Fi AP的SSID名称 | | *reserve* | char | 预留字段 | ### qosa_wifiscan_config_t Wi-Fi Scan扫描参数结构体定义如下: ```c typedef struct { qosa_uint16_t max_ap_cnt; qosa_wifiscan_channel_e channel; qosa_uint8_t scan_round; qosa_uint32_t ch_time; qosa_uint32_t max_timeout; qosa_uint32_t scan_timeout; qosa_uint8_t wifi_priority; } qosa_wifiscan_config_t ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *max_ap_cnt* | qosa_uint16_t | Wi-Fi Scan可探测的最大AP数量 | | *channel* | *qosa_wifiscan_channel_e* | Wi-Fi Scan信道(1个比特位表示1个信道);详见 [*qosa_wifiscan_channel_e*](#qosawifiscanchannel_e) | | *scan_round* | qosa_uint8_t | Wi-Fi Scan扫描轮次 | | *ch_time* | qosa_uint32_t | 每轮扫描中,每个信道的最长驻留扫描时长;单位:毫秒 | | *max_timeout* | qosa_uint32_t | 单次Wi-Fi Scan扫描请求的最大扫描时长;单位:毫秒 | | *scan_timeout* | qosa_uint32_t | 每一轮扫描的最大超时时间;单位:秒 | | *wifi_priority* | qosa_uint8_t | Wi-Fi Scan扫描优先级
*0*:数据优先;扫描过程中优先保障数据传输不中断
*1*:Wi-Fi扫描优先;优先保障扫描的信道侦听与数据捕获 | ## 枚举定义 ### qosa_wifiscan_error_e Wi-Fi Scan扫描结果码枚举定义如下: ```c typedef enum { QOSA_WIFISCAN_SUCCESS = 0, QOSA_WIFISCAN_EXECUTE_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 1, QOSA_WIFISCAN_MEM_ADDR_NULL_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 2, QOSA_WIFISCAN_INVALID_PARAM_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 3, QOSA_WIFISCAN_SEMAPHORE_WAIT_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 4, QOSA_WIFISCAN_MUTEX_TIMEOUT_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 5, QOSA_WIFISCAN_OPEN_FAIL = (QOSA_COMPONENT_WIFISCAN << 16) | 6, QOSA_WIFISCAN_BUSY_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 7, QOSA_WIFISCAN_ALREADY_OPEN_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 8, QOSA_WIFISCAN_NOT_OPEN_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 9, QOSA_WIFISCAN_HW_OCCUPIED_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 10, QOSA_WIFISCAN_NO_SET_CB_ERR = (QOSA_COMPONENT_WIFISCAN << 16) | 11, } qosa_wifiscan_error_e ``` | **成员** | **说明** | | --- | --- | | *QOSA_WIFISCAN_SUCCESS* | 函数执行成功 | | *QOSA_WIFISCAN_EXECUTE_ERR* | 函数执行失败 | | *QOSA_WIFISCAN_MEM_ADDR_NULL_ERR* | 内存申请失败 | | *QOSA_WIFISCAN_INVALID_PARAM_ERR* | 无效参数 | | *QOSA_WIFISCAN_SEMAPHORE_WAIT_ERR* | 信号量等待异常 | | *QOSA_WIFISCAN_MUTEX_TIMEOUT_ERR* | 互斥锁获取异常 | | *QOSA_WIFISCAN_OPEN_FAIL* | Wi-Fi Scan启用异常 | | *QOSA_WIFISCAN_BUSY_ERR* | Wi-Fi Scan忙碌,如正在进行扫描 | | *QOSA_WIFISCAN_ALREADY_OPEN_ERR* | Wi-Fi Scan重复启用错误 | | *QOSA_WIFISCAN_NOT_OPEN_ERR* | Wi-Fi Scan未启用 | | *QOSA_WIFISCAN_HW_OCCUPIED_ERR* | 硬件被占用 | | *QOSA_WIFISCAN_NO_SET_CB_ERR* | 未配置回调函数 | ### qosa_wifiscan_channel_e Wi-Fi Scan信道枚举定义如下: ```c typedef enum { QOSA_WIFISCAN_CHANNEL_ALL_BIT = 0x1FFF, QOSA_WIFISCAN_CHANNEL_ONE = 0x0001, QOSA_WIFISCAN_CHANNEL_TWO = 0x0002, QOSA_WIFISCAN_CHANNEL_THREE = 0x0004, QOSA_WIFISCAN_CHANNEL_FOUR = 0x0008, QOSA_WIFISCAN_CHANNEL_FIVE = 0x0010, QOSA_WIFISCAN_CHANNEL_SIX = 0x0020, QOSA_WIFISCAN_CHANNEL_SEVEN = 0x0040, QOSA_WIFISCAN_CHANNEL_EIGHT = 0x0080, QOSA_WIFISCAN_CHANNEL_NINE = 0x0100, QOSA_WIFISCAN_CHANNEL_TEN = 0x0200, QOSA_WIFISCAN_CHANNEL_ELEVEN = 0x0400, QOSA_WIFISCAN_CHANNEL_TWELVE = 0x0800, QOSA_WIFISCAN_CHANNEL_THIRTEEN = 0x1000, } qosa_wifiscan_channel_e ``` | **成员** | **说明** | | --- | --- | | *QOSA_WIFISCAN_CHANNEL_ALL_BIT* | 扫描所有信道(位掩码组合值,涵盖信道1~13) | | *QOSA_WIFISCAN_CHANNEL_ONE* | 信道1 | | *QOSA_WIFISCAN_CHANNEL_TWO* | 信道2 | | *QOSA_WIFISCAN_CHANNEL_THREE* | 信道3 | | *QOSA_WIFISCAN_CHANNEL_FOUR* | 信道4 | | *QOSA_WIFISCAN_CHANNEL_FIVE* | 信道5 | | *QOSA_WIFISCAN_CHANNEL_SIX* | 信道6 | | *QOSA_WIFISCAN_CHANNEL_SEVEN* | 信道7 | | *QOSA_WIFISCAN_CHANNEL_EIGHT* | 信道8 | | *QOSA_WIFISCAN_CHANNEL_NINE* | 信道9 | | *QOSA_WIFISCAN_CHANNEL_TEN* | 信道10 | | *QOSA_WIFISCAN_CHANNEL_ELEVEN* | 信道11 | | *QOSA_WIFISCAN_CHANNEL_TWELVE* | 信道12 | | *QOSA_WIFISCAN_CHANNEL_THIRTEEN* | 信道13 | # 应用逻辑流程图 ## 同步扫描 ```{figure} images/board_PQvTw0itzhg25zbRrUAcDcSon9q.jpg :align: center :alt: image ``` ## 异步扫描 ```{figure} images/board_RDW3w7mZthmdpfbX18Bcqqwxn48.jpg :align: center :alt: image ``` # 示例代码 同步扫描完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/location/wifiscan/wifiscan_sync.c 异步扫描完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/location/wifiscan/wifiscan_asyn.c # 开发约束与使用规范 1. **参数配置** 扫描参数 *qosa_wifiscan_config_t* 必须在成功调用 *qosa_wifiscan_open()* 前完成配置。Wi-Fi Scan启用后,再次调用 *qosa_wifiscan_option_set()* 将返回 *QOSA_WIFISCAN_ALREADY_OPEN_ERR* 报错。 2. **设备状态管理** 使用扫描接口遵循先打开、后关闭调用规范:开始扫描前必须先调用 *qosa_wifiscan_open()* 启用Wi-Fi Scan功能;业务结束后应调用 *qosa_wifiscan_close()* 关闭Wi-Fi Scan功能、释放资源。 3. **内存管理** - 同步扫描模式:调用者需要负责分配和释放 *p_ap_infos* 指向的内存空间。 - 异步扫描模式:系统自动管理 *ap_infos* 内存空间,回调函数中无需手动释放。 4. **扫描模式选择** - 同步扫描:调用任务阻塞至扫描全流程结束,适用于需要立即获取扫描结果的场景。 - 异步扫描:扫描结果通过回调函数返回,适用于不希望阻塞当前线程的场景。 5. **资源竞争** Wi-Fi Scan和LTE共享射频资源,只有当LTE处于RRC Idle状态时才可正常启动Wi‑Fi扫描。 6. **硬件占用** Wi-Fi Scan可能与蓝牙等其他无线功能共享硬件,在使用时可能遇到硬件被占用的情况。